package la.iok.hzsvn.lewin.movie.cloud.service;

import la.iok.hzsvn.lewin.movie.cloud.entity.User;
import la.iok.hzsvn.lewin.movie.cloud.model.PhoneCode;
import la.iok.hzsvn.lewin.movie.cloud.model.PhoneCodeParam;
import la.iok.hzsvn.share.annotations.NotNull;
import la.iok.hzsvn.share.annotations.Nullable;

/**
 * 手机验证码操作
 */
public interface PhoneCodeService {
    /**
     * 生成验证码并存入redis
     * @param param 验证码参数
     * @return 手机验证码
     */
    PhoneCode generateAndSavePhoneCode(PhoneCodeParam param);

    /**
     * 登录用户获取手机验证码
     * @param user 用户
     * @param param 验证码参数。此时{@link PhoneCodeParam#getCode() getCode()}可以为空
     * @return 手机验证码
     */
    PhoneCode generateAndSavePhoneCode(@Nullable User user, @NotNull PhoneCodeParam param);

    /**
     * 查询手机验证码,如果没有找到抛异常
     * @param phoneNumber 手机号码
     * @return 手机号码对应的验证码
     */
    @NotNull
    PhoneCode loadPhoneCode(@NotNull String phoneNumber);

    /**
     * 发送验证码
     * @param phoneCode 验证码信息
     */
    void sendSms(@NotNull PhoneCode phoneCode);
}
